import sys
import os

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
from image_processing_modules.clip_model import ClipModelWrapper

import numpy as np

# ---------------------- 测试用例 ----------------------
if __name__ == "__main__":
    # 初始化工具类（使用轻量模型）
    clip_wrapper = ClipModelWrapper("openai/clip-vit-large-patch14")

    # 测试1：图像向量提取
    test_image_path = "D:/Temp/Pic/test/panda_01.png"  # 替换为你的测试图像路径
    try:
        image_emb = clip_wrapper.image_to_embedding(test_image_path)
        print(
            f"图像向量形状：{image_emb.shape}，L2范数：{np.linalg.norm(image_emb):.4f}，示例值：{image_emb[:15]}..."
        )  # 应输出(512,)
    except Exception as e:
        print(f"测试1失败：{e}")

    # 测试2：文本向量生成
    test_text = "panda"
    try:
        text_emb = clip_wrapper.text_to_embedding(test_text)
        print(
            f"文本向量形状：{text_emb.shape}，L2范数：{np.linalg.norm(text_emb):.4f}，示例值：{text_emb[:15]}..."
        )  # 应输出(512,)
    except Exception as e:
        print(f"测试2失败：{e}")

    # 测试3：相似度计算（同一图像和文本的相似度应较高）
    try:
        similarity1 = clip_wrapper.compute_similarity(image_emb, text_emb)
        similarity2 = clip_wrapper.cosine_similarity(text_emb, image_emb)
        print(
            f"图像与文本的相似度1：{similarity1:.4f}，相似度2：{similarity2:.4f}"
        )  # 合理值：0.3~0.8（取决于图像内容）
    except Exception as e:
        print(f"测试3失败：{e}")

    # 测试4：批量图像向量提取（验证归一化）
    test_image_paths = [
        "D:/Temp/Pic/test/test_02.png",  # 替换为真实存在的图像路径
        "D:/Temp/Pic/test/test_01.png",  # 替换为真实存在的图像路径
    ]
    try:
        batch_emb = clip_wrapper.batch_image_to_embeddings(test_image_paths)
        # 验证输出形状：(2, 512)（假设使用ViT-B/32，dim=512）
        print(f"测试4：批量向量形状：{batch_emb.shape}")  # 应输出(2, 512)

        # 验证每行向量的L2范数≈1.0（允许±1e-6误差）
        norms = np.linalg.norm(batch_emb, axis=1)
        print(f"测试4：每行L2范数：{norms}")  # 应输出类似[1.0000, 1.0000]
        print(
            f"测试4：范数是否接近1：{np.allclose(norms, 1.0, atol=1e-6)}"
        )  # 应输出True
    except Exception as e:
        print(f"测试4失败：{e}")
